#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

/**
 * 增强的system函数，能够返回system调用的输出
 *
 * @param[in] cmdstring 调用外部程序或脚本的命令串
 * @param[out] buf 返回外部命令的结果的缓冲区
 * @param[in] len 缓冲区buf的长度
 *
 * @return 0: 成功; -1: 失败
 */
int mysystem( const char *cmdstring, char *buf, int len )
{
	int fd[2];
	pid_t pid;
	int n, count;

	memset( buf, 0, len );
	if( pipe( fd ) < 0 )
		return -1;
	if((pid = fork()) < 0 )
		return -1;
	else if( pid > 0 ) {   /* parent process */
		close( fd[1] );     /* close write end */
		count = 0;
		n = read( fd[0], buf + count, len );
		if( n == len ) n--;
		buf[n] = '\0';

		close( fd[0] );
		if( waitpid( pid, NULL, 0 ) > 0 )
			return -1;
	}
	else {                /* child process */
		close( fd[0] );     /* close read end */
		if( fd[1] != STDOUT_FILENO ) {
			if( dup2( fd[1], STDOUT_FILENO ) != STDOUT_FILENO )	{
				return -1;
			}
			close( fd[1] );
		}
		if( execl( "/bin/sh", "sh", "-c", cmdstring, (char *)0 ) == -1 )
			return -1;
	}
	return 0;
}


int main( int argc, char *argv[] )
{
	char buf[30];

	mysystem( "ls", buf, sizeof(buf));
	printf( "%s", buf );

	/*
	 * use popen.
	   char buf2[5];
	   FILE * pf = popen("ls", "r");
	   while( fgets(buf2, 5, pf ) ) {
		printf( "%s1", buf2 );
	   }
	   fclose(pf);
	 */
}
